﻿<?php

/**
*	
*		Class tạo đường link thanh toán quá qua SenPay.vn và kiểm tra đường link kết quả thanh toán trả về 
*		 Mã secure là một tham số được tạo bởi thuật toán SHA1 các tham số giao tiếp giữa SenPay.vn và website bán hàng 
*		và một chuỗi ký tự gọi là mật khẩu giao tiếp (secure_pass) . Hàm GetSHA1Hash sẽ tự động sinh ra secure_code khi truyền tham số vào
* 		Người dùng không thể tự động sửa được giá trị tham số giao tiếp giữa website của bạn và SenPay.vn nếu như không biết chính xác tham số bạn đã lưu và mật khẩu giao tiếp là gì. 
*		
**/

class SenPay_Checkout 
{
    // Địa chỉ thanh toán hoá đơn của SenPay.vn
	//Url CheckOut Test : http://sandbox.senpay.vn/CheckOut/CheckOut.aspx
	//Url CheckOut Live : https://SenPay.vn/CheckOut/CheckOut.aspx
    private $SenPay_url = 'http://sandbox.senpay.vn/CheckOut/CheckOut.aspx';
        
    private $reciverid='1378032520'; //13780325 chỉ là ví dụ, thay mã tài khoản (mã tài khoản nhận tiền tại SenPay) mà bạn đã đăng ký tại đây

    // Mã website của bạn đăng ký trong chức năng tích hợp thanh toán của SenPay.vn.
    private $merchant_site_code = '10000036';	//10000036 chỉ là ví dụ, thay mã merchant site mà bạn đã đăng ký vào dây

    // Mật khẩu giao tiếp giữa website của bạn và SenPay.vn.
    // Nếu bạn thay đổi mật khẩu giao tiếp trong quản trị website của chức năng tích hợp thanh toán trên SenPay.vn, vui lòng update lại mật khẩu này trên website của bạn
    private $secure_pass= '123456'; //123456 chỉ là ví dụ , bạn hãy thay mật khẩu giao tiếp giữa website của bạn với SenPay.vn mà bạn đã đăng ký vào dây

    //Hàm xây dựng url, trong đó có tham số mã hóa (còn gọi là public key)
    public function buildCheckoutUrl($return_url, $transaction_info, $order_code, $price)
    {
        // Mảng các tham số chuyển tới SenPay
		$arr_param = array(
				'merchant_site_code'    =>	strval($this->merchant_site_code),
				'return_url'		=>	strval(strtolower(urlencode($return_url))),
				'receiver'		=>	strval($this->reciverid),
				'transaction_info'	=>	urlencode($transaction_info),
				'order_code'		=>	strval($order_code),
				'price'			=>	strval($price)					
			);
			
		$str .= ' ' . strval($this->merchant_site_code);
		$str .= ' ' . strval(strtolower(urlencode($return_url)));
		$str .= ' ' . strval($this->reciverid);
		$str .= ' ' . strval($transaction_info);
		$str .= ' ' . strval($order_code);
		$str .= ' ' . strval($price);
		$str .= ' ' . strval($this->secure_pass);
			
		$arr_param['secure_code'] = sha1($str);
			
		/* Bước 2. Kiểm tra  biến $redirect_url xem có '?' không, nếu không có thì bổ sung vào*/
		$redirect_url = $this->SenPay_url;
		if (strpos($redirect_url, '?') === false)
		{
				$redirect_url .= '?';
		}
		else if (substr($redirect_url, strlen($redirect_url)-1, 1) != '?' && strpos($redirect_url, '&') === false)
		{
				// Nếu biến $redirect_url có '?' nhưng không kết thúc bằng '?' và có chứa dấu '&' thì bổ sung vào cuối
				$redirect_url .= '&';
		}
					
		/* Bước 3. tạo url*/
		$url = '';
		foreach ($arr_param as $key=>$value)
		{
				if ($url == '')
						$url .= $key . '=' . $value;
				else
						$url .= '&' . $key . '=' . $value;
		}
			
		return $redirect_url.$url;
    }
	
    /**
     *  HÀM KIỂM TRA TÍNH ĐÚNG ĐẮN CỦA ĐƯỜNG LINK KẾT QUẢ TRẢ VỀ TỪ SenPay KHI THÀNH CÔNG (ERROR_CODE == 0)
     * @param <type> $transaction_info Thông tin về giao dịch, Giá trị do website gửi sang
     * @param <type> $order_code Mã hoá đơn/tên sản phẩm
     * @param <type> $price Tổng tiền đã thanh toán
     * @param <type> $payment_id Mã giao dịch tại SenPay
     * @param <type> $payment_type Hình thức thanh toán: 1 - Thanh toán Tạm giữ (tiền người mua đã thanh toán nhưng SenPay đang giữ hộ); 2 - Thanh toán ngay (tiền đã chuyển vào tài khoản SenPay của người bán)
     * @param <type> $error_code Mã lỗi trả về: 0 - Thành công; !0 - Lỗi (Nội dung lỗi trong error_text)
     * @param <type> $secure_code Mã kiểm tra
     * @return <type>
     */
    public function verifyPaymentUrl_Success($transaction_info, $order_code, $price, $payment_id, $payment_type,$error_code, $secure_code){
        //// Tạo mã xác thực từ chủ web
        $str = '';
        $str .= ' ' . strval($transaction_info);
        $str .= ' ' . strval($order_code);
        $str .= ' ' . strval($price);
        $str .= ' ' . strval($payment_id);
        $str .= ' ' . strval($payment_type);
        $str .= ' ' . strval($error_code);
        $str .= ' ' . strval($this->merchant_site_code);
        $str .= ' ' . strval($this->secure_pass);
               
        // Mã hóa các tham số
	$verify_secure_code = '';
	$verify_secure_code = sha1($str);
		
	// Xác thực mã của chủ web với mã trả về từ SenPay.vn
        if ($verify_secure_code === $secure_code) return true;
		
        return false;
    }

    /**
     * HÀM KIỂM TRA TÍNH ĐÚNG ĐẮN CỦA ĐƯỜNG LINK KẾT QUẢ TRẢ VỀ TỪ SenPay KHI BỊ LỖI (ERROR_CODE != 0)
     * @param <type> $order_code Mã hoá đơn/tên sản phẩm
     * @param <type> $error_code Mã lỗi trả về: 0 - Thành công; !0 - Lỗi (Nội dung lỗi trong error_text)
     * @param <type> $secure_code Mã kiểm tra
     * @return <type>
     */
    public function verifyPaymentUrl_Error($order_code, $error_code,$secure_code){
        // Mã hóa các tham số
        $str = '';
        $str .= ' ' . strval($order_code);
        $str .= ' ' . strval($error_code);
        $str .= ' ' . strval($this->secure_pass);

        // Xác thực mã của chủ web với mã trả về từ SenPay.vn
        if (sha1($str) == $secure_code) return true;
            return false;
    }
        
    public function GetSHA1Hash($arr_param){
        $str ='';
        $str .= implode(' ', $arr_param) . ' ' . $this->secure_pass;
        return sha1($str);
    }
}
?>